package java_DesignPattern.StructuralPattern.ProxyPattern.DynamicProxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理工厂(JDK)---仿写
 */
public class ProxyFactory {

    //声明目标类对象
    private TranStation station = new TranStation();

    //获取代理类对象
    public SellTickets getProxyObject(){
        //通过Proxy类获取代理对象,通过多态接收,因为代理类与目标类都实现了同一个接口
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(
                //1,类加载器
                station.getClass().getClassLoader(),
                //2,接口字节码
                station.getClass().getInterfaces(),
                //3,反射处理器
                new InvocationHandler() {
                    //代理对象/反射处理器调用---相当于proxy.sell()
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //参数1:当前代理对象
                        //参数2:回调方法抽象对象
                        //参数3:回调方法参数
                        /**
                         * 方法增强处
                         */
                        System.out.println("代售点收取服务费用");
                        //原始对象调用---相当于station.sell()
                        Object obj = method.invoke(station, args);
                        return obj;
                    }
                }
        );
        return sellTickets;
    }
}
